﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mc.Fe.Entities;
using Mc.Fe.Data;
using System.Transactions;

namespace Mc.Fe.Logic
{
    public class DataManager
    {
        #region Singleton
        private static volatile DataManager instance;
        private static object syncRoot = new Object();

        private DataManager() { }

        public static DataManager Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new DataManager();
                    }
                }

                return instance;
            }
        }
        #endregion

        public List<Documento> BuscarDocumentos()
        {
            return Accessor.BuscarDocumentos();
        }

        public List<Factura> BuscarFacturasPendientes(string estado, string fechaDesde)
        {
            return Accessor.BuscarFacturasPendientes(estado, fechaDesde);
        }

        /// <summary>
        /// Devuelve Factura y sus detalles
        /// </summary>
        /// <param name="codigoEmpresa"></param>
        /// <param name="codigoTipoDocumento"></param>
        /// <param name="nroDocumento"></param>
        /// <returns></returns>
        public Factura BuscarFactura(string codigoEmpresa, string codigoTipoDocumento, string nroDocumento)
        {
            var factura = Accessor.BuscarFactura(codigoEmpresa, codigoTipoDocumento, nroDocumento);
            var detalles = Accessor.BuscarDetalleFacturas(codigoEmpresa, codigoTipoDocumento, nroDocumento);
            this.SetReferenciaId(factura);
            this.SetNroReferenciaSUNAT(factura);
            factura.Detalles = detalles;
            return factura;
        }

        /// <summary>
        /// Guarda tabla de control
        /// </summary>
        /// <param name="factura"></param>
        public void GuardarControl(Factura factura)
        {
            Documento documento = new Documento();
            documento.CodigoEmpresa = factura.CodigoEmpresa;
            documento.CodigoTipoDocumento = factura.CodigoTipoDocumento;
            documento.NroDocumento = factura.NumDocumento;
            documento.Estado = "E";
            documento.FechaEnvio = DateTime.Now;
            documento.ReferenciaId = factura.ReferenciaId;

            Accessor.GuardarControl(documento);
        }

        /// <summary>
        /// Guarda tabla de notificaciones
        /// </summary>
        /// <param name="notificacion"></param>
        public void GuardarNotificacion(Notificacion notificacion)
        {
            var item = Accessor.GenerarCorrelativo();
            using (TransactionScope tr = new TransactionScope())
            {
                notificacion.Item = item;
                string estado = "R"; notificacion.Aceptado = false;

                if (notificacion.ResponseCode.CompareTo("0") == 0)
                {
                    notificacion.Aceptado = true;
                    estado = "A";
                }
                Accessor.ActualizarEstado(notificacion.ReferenciaID, estado);

                notificacion.Fecha = DateTime.Now;
                Accessor.GuardarNotificacion(notificacion);

                tr.Complete();
            }
        }

        /// <summary>
        /// Genera Nro de Documento para Sunat
        /// </summary>
        /// <param name="factura"></param>
        /// <returns></returns>
        public void SetReferenciaId(Factura factura)
        {
            if (factura == null) return ;
            string nroDocumento = "F" + factura.Serie + "-" + factura.NroDocumento.PadLeft(8, '0');
            factura.ReferenciaId = nroDocumento;
        }

        /// <summary>
        /// Genera Nro de Referencia para Sunat
        /// </summary>
        /// <param name="factura"></param>
        /// <returns></returns>
        public void SetNroReferenciaSUNAT(Factura factura)
        {
            if (factura == null) return;
            string nroDocumentoRerencia = string.Empty;
            if (!string.IsNullOrEmpty(factura.NroDocumentoReferencia))
                nroDocumentoRerencia = "F" + factura.NroDocumentoReferencia.Substring(0, 3) + '-' + factura.NroDocumentoReferencia.Substring(4, 7).PadLeft(8, '0');
            factura.NroDocumentoReferenciaSUNAT = nroDocumentoRerencia;
        }

        #region Accessor
        private static DataAccesor Accessor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return DataAccesor.CreateInstance(); }
        }
        #endregion Accessor

    }
}
